//
//#include "../../../../../../../sdk2/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/linux/prctl.h"
//#include "../../../../../../../sdk2/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/sys/prctl.h"
//#include "queue.h"
//#include "../../../../../extra/ffmpeg/arm64-v8a/include/libavutil/frame.h"
//#include "../../../../../extra/ffmpeg/arm64-v8a/include/libavcodec/avcodec.h"
//#include "../../../../../../../sdk2/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/lib64/clang/9.0.8/include/opencl-c-base.h"
//#include "../../../../../../../sdk2/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/c++/v1/cstdint"
//#include "../../../../../../../sdk2/ndk-bundle/toolchains/llvm/prebuilt/windows-x86_64/sysroot/usr/include/time64.h"
//#include "media_codec.h"
//#include "macro.h"
//
//void* video_decode_sw_thread(void* data){
//    prctl(PR_SET_NAME, __func__);
//    AVPlayContext* context = (AVPlayContext *)data;
//    int ret;
//    AVFrame* frame = frame_pool_get_frame(context->video_frame_pool);
//
//    while (!context->abort_request) {
//        if (context->just_audio) {
//            // 如果只播放音频  按照音视频同步的速度丢包
//            if( -1 == drop_video_packet(context)){
//                break;
//            }
//        } else {
//            ret = avcodec_receive_frame(context->video_codec_ctx, frame);
//            if (ret == 0) {
//                frame->FRAME_ROTATION = context->frame_rotation;
//                frame_queue_put(context->video_frame_queue, frame);
//                usleep(2000);
//                frame = frame_pool_get_frame(context->video_frame_pool);
//            } else if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF) {
//                AVPacket *packet = packet_queue_get(context->video_packet_queue);
//                // buffer empty ==> wait  10ms
//                // eof          ==> break
//                if (packet == NULL) {
//                    if (context->eof) {
//                        avcodec_send_packet(context->video_codec_ctx, NULL);
//                        if (ret == AVERROR_EOF) {
//                            break;
//                        } else {
//                            continue;
//                        }
//                    } else {
//                        LOGE("video buffer empty!!!!!!!!!");
//                        usleep(BUFFER_EMPTY_SLEEP_US);
//                        continue;
//                    }
//                }
//                // seek
//                if (packet == &context->video_packet_queue->flush_packet) {
//                    frame_queue_flush(context->video_frame_queue, context->video_frame_pool);
//                    avcodec_flush_buffers(context->video_codec_ctx);
//                    continue;
//                }
//                ret = avcodec_send_packet(context->video_codec_ctx, packet);
//                packet_pool_unref_packet(context->packet_pool, packet);
//                if (ret < 0) {
//                    LOGE("%s send packet error: %d", __func__, ret);
//                    context->on_error(context, ERROR_VIDEO_SW_DECODE_SEND_PACKET);
//                    break;
//                }
//            } else if (ret == AVERROR(EINVAL)) {
//                LOGE("%s avcodec_receive_frame AVERROR(EINVAL)", __func__);
//                context->on_error(context, ERROR_VIDEO_SW_DECODE_CODEC_NOT_OPENED);
//                break;
//            } else {
//                LOGE("%s avcodec_receive_frame ret: %d", __func__, ret);
//                context->on_error(context, ERROR_VIDEO_SW_DECODE_RECIVE_FRAME);
//                break;
//            }
//        }
//    }
//    context->error_code = BUFFER_FLAG_END_OF_STREAM;
//    LOGI("thread ==> %s exit", __func__);
//    return NULL;
//}
//
//
//
//
//
//void* video_decode_hw_thread(void* data){
//    prctl(PR_SET_NAME, __func__);
//    AVPlayContext* context = (AVPlayContext *)data;
//
//    int ret;
//    AVPacket* packet = NULL;
//    AVFrame* frame = frame_pool_get_frame(context->video_frame_pool);
//    int64_t seek_time = 0;
//    int64_t current_pts = 0;
//
//    while (!context->abort_request) {
//        if (context->just_audio) {
//            // 如果只播放音频  按照音视频同步的速度丢包
//            if (-1 == drop_video_packet(context)){
//                break;
//            }
//        } else {
//            ret = mediacodec_receive_frame(context, frame);
//            if (ret == BUFFER_FLAG_END_OF_STREAM) {
//                context->error_code = BUFFER_FLAG_END_OF_STREAM;
//                continue;
//            }
//            if (ret >= 0) {
//                current_pts = frame->pts / 1000;
//                if (context->precise_seek) {
//                    // 精准seek
//                    // 往后seek
//                    if (current_pts < context->seek_to) {
//                        mediacodec_release_buffer(context, frame);
//                    } else {
//                        // 只显示一帧
//                        frame->FRAME_ROTATION = context->frame_rotation;
//                        frame_queue_put(context->video_frame_queue, frame);
//                        frame = frame_pool_get_frame(context->video_frame_pool);
//                        if (context->on_seeking && context->status == SEEKING) {
//                            context->on_seeking(context);
//                            context->status = SEEK_COMPLETE;
//                        }
//                    }
//                } else {
//                    // 按时间显示到固定帧
//                    // 往前seek
//                    bool seek = context->seek_to > current_pts;
//                    if (seek) {
//                        // seek时按顺序解码, 但是跳帧显示, 100ms显示一帧
//                        if (current_pts < seek_time) {
//                            mediacodec_release_buffer(context, frame);
//                            continue;
//                        } else {
//                            seek_time = current_pts + 100;
//                        }
//                    } else {
//                        seek_time = 0;
//                    }
////                    LOGE("frame count: %d size: %d width: %d line_size: %d height: %d", context->video_frame_queue->count, context->video_frame_queue->size, frame->width, frame->linesize[0], frame->height);
//                    frame->FRAME_ROTATION = context->frame_rotation;
//                    frame_queue_put(context->video_frame_queue, frame);
//                    frame = frame_pool_get_frame(context->video_frame_pool);
//                    if (context->on_seeking && seek) {
//                        context->on_seeking(context);
//                        context->status = SEEK_COMPLETE;
//                    }
//                }
//            }
//
//            // queue mediacodec input
//            if (packet == NULL) {
//                packet = packet_queue_get(context->video_packet_queue);
//            }
//            // buffer empty ==> wait  10ms
//            // eof          ==> break
//            if (packet == NULL) {
//                if (context->eof && !context->end_of_stream) {
//                    LOGE("context->eof mediacodec_end_of_stream ret: %d current_pts: %lld packet_pts: %lld duration: %lld", ret, current_pts, context->current_video_packet_pts, context->duration);
//                    context->end_of_stream = true;
//                } else if (!context->end_of_stream) {
//                    usleep(BUFFER_EMPTY_SLEEP_US);
//                    continue;
//                }
//            }
//            // seek
//            if (packet == &context->video_packet_queue->flush_packet) {
//                LOGE("packet == &context->video_packet_queue->flush_packet");
//                packet = NULL;
//                continue;
//            }
//            int buffer_index = mediacodec_dequeue_input_buffer_index(context);
////            LOGE("ret: %d buffer_index: %d packet_count: %d", ret, buffer_index, context->video_packet_queue->count);
//            if (buffer_index >= 0) {
//                if (context->end_of_stream) {
//                    mediacodec_end_of_stream(context, buffer_index);
//                    LOGE("context->end_of_stream");
//                    continue;
//                }
//                if (!packet) {
//                    continue;
//                }
//                ret = mediacodec_send_packet(context, packet, buffer_index);
//                if (0 == ret) {
//                    packet_pool_unref_packet(context->packet_pool, packet);
//                    packet = NULL;
//                } else {
//                    // some device AMediacodec input buffer ids count < frame_queue->size
//                    // when pause   frame_queue not full
//                    // thread will not block in  "frame_queue_put" function
//                    if (context->status == PAUSED) {
//                        LOGE("video_decode_hw_thread paused");
//                        usleep(NULL_LOOP_SLEEP_US);
//                    }
//                }
//            }
//        }
//    }
//    (*context->vm)->DetachCurrentThread(context->vm);
//    LOGE("thread ==> %s exit", __func__);
//    return NULL;
//}
